package zzz.EasyMock.Demo01;

import org.easymock.EasyMock;
import org.junit.Assert;
import org.junit.Test;

/**
 * 演示Record-Replay-Verify模型，这个模型首先记录mock对象上的操作然后重演并验证这些操作。
 */


public class Demo01 {
	@Test
	public void test() {
		// 创建mock对象，并期望这个mock对象的方法被调用，
		// 开始Record阶段，我们需要给出的是我们对mock对象的一系列期望：若干个mock对象被调用，依从我们给定的参数，顺序，次数等，并返回预设好的结果(返回值或者异常).
		Domain domain = EasyMock.createMock(Domain.class);
		EasyMock.expect(domain.getValue()).andReturn(3);
		domain.setValue(2);
		domain.zzz("a");
		
		// 在Replay阶段，我们关注的主要测试对象将被创建，之前在record阶段创建的相关依赖被关联到主要测试对象，然后执行被测试的方法，以模拟真实运行环境下主要测试对象的行为。
		EasyMock.replay(domain);
		domain.setValue(2);
		int value = domain.getValue();
		domain.zzz("b");
		
		// 在Verify阶段，我们将验证测试的结果和交互行为。
		Assert.assertEquals(3, value);
		EasyMock.verify(domain);
	}
}

class Domain {
	private int value;

	public int getValue() {
		return value;
	}

	public void setValue(int value) {
		this.value = value;
	}
	
	public static void zzz(String a) {
	}
}